<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>队列</title>
	</head>
	<body>
	</body>
</html>
<script type="text/javascript">
	// 前面删除 后面添加  是一种受限的线性结构
	/*
	在前面删除元素，在后面添加元素
	先进先出（FIFO FIrst In First Out）
	受限之处在于它只允许在表的前端（front）进行删除操作
	而在表的后端(rear)进行插入操作
	
	
	打印队列
	
	线程队列
	
	队列类的创建
		1.队列的实现和栈一样，有两种方案
		    基于数组实现
			基于链表实现
			
	队列的常见操作
		1.enqueue（element）:想队列尾部添加一个（或者多个）新的项
		2.dequeue():移除队列的低于个（即排在队列最前面的）项，并返回被移除的元素
		3.front:返回队列中第一个元素————最先被添加，也将是最先被	移除的元素。队列不做任何变大（
		不移除元素，只返回元素信息————与Stack类的peek方法类似）
		4.isRmpty():如果队列中不包含任何元素，返回true，否则返回false。
		5.size():返回队列包含的元素个数，与数组的length属性类似。
		6.toString():将队列中的内容，转成字符串形式。
	
	**/
	// 封装队列类------------基于数组
	
	function Queue(){
		// 属性：：
		this.items=[]
		// 方法：
		// 1.将元素加入到队列中
		Queue.prototype.enqueue = function(element){
			this.items.push(element)
		}
		// 2.从队列中删除当前元素
		Queue.prototype.dequeue = function(){
			return this.items.shift()
		}
		// 3.查看前端的元素
		Queue.prototype.front = function(){
			return this.items[0]
		}
		// 4.查看队列是否为空
		Queue.prototype.isEmpty = function(){
			return this.items.length ==0
		}
		// 5.查看队列中元素的个数
		Queue.prototype.size = function(){
			return this.items.length
		}
		// 6.toString方法
		Queue.prototype.toString = function(){
			return this.items.join(',')
		}
		
	}
	// 使用队列
	// var queue = new Queue()
	
	// queue.enqueue("231321")
	// queue.enqueue("abc")
	// alert(queue)
	// queue.dequeue()
	// alert(queue)
	
	// alert(queue.front())
	
	// alert(queue.isEmpty())
	
	// alert(queue.size())
	
	
	
	// --------------------------------------------击鼓传花-----------------------------------------
	
	function passGame(nameList,number){
		// 1.c创建队列结构
		var queue = new Queue()
		
		// 2.将所有数据加入队列当中
		for (let i = 0; i < nameList.length; i++) {
			queue.enqueue(nameList[i])
		}
		
		while(queue.size() > 1){
			// 3.开始数数字
			// 不是number的时候，重新加入到队列当中
			// 如果是number这个的时候，将其从队列中删除
			// 3.1 不是Nubmber之前的数从新加入到队列当中
			 for (var i = 0; i < number-1; i++) {
			 	queue.enqueue(queue.dequeue())
			 }
			 // 3.2 number对应这个人，直接从队列中删除
			 queue.dequeue()
		}
		
		// 4.获取剩余的人	
	    // alert(queue.size())	
		var endName = queue.front()
		
		
		// alert('最终剩下的那个人',endName)	 
		
		return  nameList.indexOf(endName)	 
	
	}
	var names = ['Lily','Tom','LiLei','ZhangShan']
	
	// alert(passGame(names,3))
	
	
	
	
	
</script>
